const express = require('express');
const {createProxyMiddleware} = require('http-proxy-middleware');
const cors = require('cors'); // 可选，也可以手动设置 CORS 头
const axios = require('axios');
const app = express();
const PORT = 3000;


// ======================
// 🛠️ 可配置的转发规则
// ======================

// 定义多个代理规则：根据请求路径，代理到不同的后端
// const PROXY_RULES = [
//     {
//         path: '/api', // 匹配请求路径，比如 /api/users
//         target: 'https://api.coze.cn/api/trigger/v1/webhook/biz_id/bot_platform/hook/1000000000549160706', // 目标服务器地址（支持 HTTP / HTTPS）
//         pathRewrite: { '/': '/' }, // 可选：将 /api/users 代理到目标 /users
//         changeOrigin: true, // 修改请求头中的 host 为目标地址，有助于绕过某些服务器限制
//         logLevel: 'debug', // 打印代理日志（可选：'debug', 'info', 'warn', 'error', 'silent'）
//         name: 'redirect api', // 自定义标识，方便日志识别
//     },
//     // 你可以继续添加更多规则，比如：
//     {
//       path: '/another-api',
//       target: 'http://another-service.com',
//       pathRewrite: { '^/another-api': '/v1' },
//       changeOrigin: true,
//       name: 'Another Custom API',
//     },
// ];

// ======================
// 🌍 CORS 配置（高度自定义）
// ======================

// 可以使用 cors() 中间件快速启用（推荐）
// 或者手动设置响应头（见下方注释方案）

// 方案 A：使用 cors() 中间件（推荐，简单且可配置）
// app.use(
//     cors({
//         origin: '*', // 允许任何来源，生产环境建议指定域名如 'https://your-frontend.com'
//         methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的 HTTP 方法
//         allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], // 允许的请求头
//     })
// );

// 方案 B（备选）：手动设置 CORS 头（如果你不想用 cors 包）
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
    if (req.method === 'OPTIONS') {
        return res.sendStatus(204); // No content for preflight
    }
    next();
});

// 用于解析JSON格式的请求体
app.use(express.json({
    limit: '2100000kb'
}));

// 用于解析URL编码的请求体（例如，来自表单的POST请求）
// app.use(express.urlencoded({ extended: true }));


app.post('/api', (req, res) => {
    console.log(JSON.stringify(req.body));

    const testApi = {
        url: 'https://api.coze.cn/api/trigger/v1/webhook/biz_id/bot_platform/hook/1000000000549161218',
        token: 'xOjAKhFi'
    }

    const prdApi = {
        url: 'https://api.coze.cn/api/trigger/v1/webhook/biz_id/bot_platform/hook/1000000000549177090',
        token: 'TBqHJBLq'
    }

    const targetApi = prdApi;

    if(req.body.input.length === 0) {
        console.log('✅ 请求成功！没有新增数据，不转发 coze');
        res.status(200).json({
            message: "未转发数据"
        })
    }

// 发送 POST 请求
    axios.post(targetApi.url, JSON.stringify(req.body), {
        headers: {
            'Authorization': `Bearer ${targetApi.token}`,
            'Content-Type': 'application/json'  // 通常需要明确指定
        }
    })
        .then(response => {
            console.log('✅ 请求成功！响应:', response.data);
            res.status(200).json({
                message: "上传数据成功"
            })
        })
        .catch(error => {
            if (error.response) {
                // 服务器返回了错误状态码，比如 4xx, 5xx
                console.error('❌ 请求失败，服务器返回：');
                console.error('状态码:', error.response.status);
                console.error('响应体:', error.response.data); // 重点：这里会显示 {"code":41001002, "message":...}
            } else if (error.request) {
                // 请求发出去，但没有收到响应
                console.error('❌ 请求未收到响应:', error.request);
            } else {
                // 其他错误
                console.error('❌ 请求设置出错:', error.message);
            }
        });


})

// ======================
// 🔄 注册代理中间件
// ======================
//
// PROXY_RULES.forEach((rule) => {
//     console.log(`[Proxy] 注册规则: 路径 "${rule.path}" => 目标 "${rule.target}" (name: ${rule.name})`);
//
//     app.use(
//         rule.path,
//         createProxyMiddleware({
//             target: rule.target,
//             changeOrigin: rule.changeOrigin !== false, // 一般设为 true，模拟真实客户端访问
//             pathRewrite: rule.pathRewrite || {}, // 可重写路径，比如去掉前缀
//             secure:false,
//             selfHandleResponse: true,
//             logLevel: rule.logLevel || 'info', // 打印代理日志，调试用
//             onProxyReq: (proxyReq, req, res) => {
//                 // 可在此处修改即将发出的请求（比如添加自定义头）
//                 console.log(`[ProxyReq] → ${rule.name} | ${req.method} ${req.originalUrl} => ${rule.target}${req.path}`);
//                 // 例子：proxyReq.setHeader('X-Special-Header', 'foobar');
//                 // proxyReq.setHeader('Authorization', 'Bearer QAHGQgSw');
//                 // proxyReq.setHeader('Content-Type', 'application/json');
//
//                 if (req.body) {
//                     const bodyData = JSON.stringify(req.body)
//                     // incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json
//                     proxyReq.setHeader("Content-Type", "application/json")
//                     proxyReq.setHeader("Content-Length", Buffer.byteLength(bodyData))
//                     // stream the content
//                     proxyReq.write(bodyData)
//                 }
//                 res.send(proxyReq);
//             },
//             onProxyRes: (proxyRes, req, res) => {
//                 // 可在此处修改响应（比如添加头、记录响应状态等）
//
//                 console.log(`[ProxyRes] ← ${rule.name} | Status: ${proxyRes.statusCode} | ${req.method} ${req.originalUrl}`);
//                 // 例子：proxyRes.headers['x-added'] = 'value-from-proxy';
//
//                 // proxyRes.setHeader('Authorization', 'Bearer QAHGQgSw');
//                 // proxyRes.setHeader('Content-Type', 'application/json');
//
//                 // res.setHeader('Access-Control-Allow-Origin', '*');
//                 // res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
//                 // res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
//                 // if (req.method === 'OPTIONS') {
//                 //     return res.sendStatus(204); // No content for preflight
//                 // }
//
//                 let bodyRes
//                 bodyRes = getBody(proxyRes).then(() => {
//                     console.log("1 res from proxied server:", bodyRes);
//                     res.send({
//                             code: 200,
//                             data: bodyRes,
//                         }
//                     )
//                 })
//
//
//             },
//             onError: (err, req, res) => {
//                 console.error(`[ProxyError] | ${req.method} ${req.originalUrl} | 错误:`, err.message);
//                 res.writeHead(500, {
//                     'Content-Type': 'text/plain',
//                 });
//                 res.end(`代理请求出错: ${err.message}`);
//             },
//         })
//     );
// });

// ======================
// 🧪 测试路由（可选）
// ======================

// 提供一个根路径，用于检查代理服务是否运行
app.get('/', (req, res) => {
    res.send(`
    <h1>🚀 自定义 Node.js 代理服务运行中</h1>
    <p>📡 代理规则已加载，尝试POST如下路径：</p>
    <ul>
      <li><a href="/api">localhost:3000/api</a> → 转发到舆情分析系统</li>
    </ul>
    <p>🔧 Powered By @issliu</p>
  `);
});

// ======================
// ▶️ 启动服务
// ======================

app.listen(PORT, () => {
    console.log(`\n🎯 代理服务已启动：http://localhost:${PORT}`);
    console.log(`📋 当前代理规则：\n`);
    // PROXY_RULES.forEach((r) => {
    //     console.log(`  → PATH "${r.path}" → TARGET "${r.target}" (name: ${r.name})`);
    // });
    console.log(`\n✅ 支持：CORS、路径重写、自定义日志、错误处理、多目标转发`);
});